'use strict';

/**
 * Throttle decorator
 * @param {Function} fn
 * @param {Number} freq
 * @return {Function}
 */
function throttle(fn, freq) {
    let timestamp = 0;
    const threshold = 1000 / freq;
    let timer = null;
    return function throttled() {
        const force = this === true;

        const now = Date.now();
        if (force || now - timestamp > threshold) {
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            timestamp = now;
            return fn.apply(null, arguments);
        }
        if (!timer) {
            timer = setTimeout(() => {
                timer = null;
                timestamp = Date.now();
                return fn.apply(null, arguments);
            }, threshold - (now - timestamp));
        }
    };
}

export default throttle;
